﻿#include<boost/asio.hpp>
#include<memory>
#include<type_traits>
#include<iostream>
#include"Service.hpp"
#include<stdexcept>
#include"../Base/Network/BinaryDispatch.hpp"
#include<filesystem>

#ifdef WIN32
#include<windows.h>
#endif


namespace SC_SUN
{
    using namespace boost::asio;
    using namespace MMFNetwork;

    Service::Service(
            SessionMgr& sessionMgr,
            const std::string& ip, 
            uint16_t port
        )
        : mIp(ip)
        , mPort(port)
        , mSessions(sessionMgr)
    {
        //添加序列化缓冲池
        for (int i = 0; i < 64; i++)
        {
            std::vector<char> buff(MMFNetwork::MAX_MESSAGE_BUFFER_SIZE);
            mSerialInPool.PushObject(buff);
        }
    }

    Service::~Service()
    {

    }

    bool Service::Start()
    {
        //创建消息分发器
        mDispatcher = std::make_shared<MMFNetwork::BinaryDispatch>([this](const std::shared_ptr<Session>& session, MMFMessageHeader* pkg){
            //默认消息处理函数
            //需要对没有监听的消息进行错误处理
            //throw std::logic_error("unhandled network message!");
            std::cout << "unhandled network message! for " << pkg->mName << std::endl;
        });

        try 
        {
            uint16_t port = mPort;
            uint32_t bufferSize = MMFNetwork::MAX_MESSAGE_BUFFER_SIZE;   

            //服务器错误回调
            auto serverErrorHandler = [this](Server* server, boost::system::error_code err){
                //需要有日志和错误提示并退出程序

                //启动失败退出程序
                
            };

            //session出错回调
            auto sessionErrHandler = [this](const std::shared_ptr<Session>& session, boost::system::error_code err)
            {
                //管理器删除对应的ip的session
                mSessions.DelSession(session); 

                //删除对应的流广播通道            

                //需要有日志和通知给显控

            };

            //session状态变更回调
            auto sessionStatusHandler = [this](const std::shared_ptr<Session>& session, Status status)
            {
                //数据收发过程中链接意外断开，或者客户端强制断开
                if (status != Status::Connected)
                {
                    //删除session
                    mSessions.DelSession(session);

                    //删除对应的流广播通道

                    //需要有日志和通知给显控

                }
            };

            //session链接回调
            auto sessionConnectHandler = [this](const std::shared_ptr<Session>& session){
                //管理器增加对应的ip的session
                mSessions.AddSession(session);
            };

            //session包处理函数
            auto sessionPackageHandler = [this](const std::shared_ptr<Session>& session, void* pkg, size_t size){
                mDispatcher->HandleMessage(session, pkg, size);
            };
            
            mServer = std::make_shared<Server>(
                port,
                bufferSize,
                serverErrorHandler,
                sessionErrHandler,
                sessionStatusHandler,
                sessionPackageHandler,
                sessionConnectHandler,
                mIp);

            mServer->Start();

            std::cout << "socket server start port" << mPort << std::endl;
        } 
        catch (...) 
        {
            //启动单元
            return false;
        }
        

        return true;
    }
    
    void Service::Stop()
    {
        //服务停止
        mServer->Stop();

        //停止消息分发
        mDispatcher->Stop();
    }

    std::shared_ptr<MMFNetwork::BinaryDispatch> Service::Dispatcher()
    {
        return mDispatcher;
    }
}